package model

// CheckList 服务器基本信息清单，用于做心跳检测
type CheckList struct {
	master  *ServerList
	servers map[Address]*Server
}

// NewCheckList 创建检查表
// 本函数只会在程序启动时执行，不会被并发访问，所以没有加锁
func NewCheckList(master *ServerList) *CheckList {
	servers := make(map[Address]*Server)

	// 给副本添加数据
	for addr, server := range master.servers {
		servers[addr] = server
	}

	return &CheckList{
		master:  master,
		servers: servers,
	}
}

// GetMaster 获取主列表
func (list *CheckList) GetMaster() *ServerList {
	return list.master
}

// GetServers 获取所有服务器信息
func (list *CheckList) GetServers() map[Address]*Server {
	return list.servers
}

// UpdateToLatestStatus 更新到最新状态
func (list *CheckList) UpdateToLatestStatus() {
	list.master.mutex.RLock()
	defer list.master.mutex.RUnlock()

	// 查看原本中记录的服务器信息列表是否有变动
	if !list.master.update {
		return
	}

	// 添加服务器
	for addr, server := range list.master.addedServers {
		list.servers[addr] = server
		delete(list.master.addedServers, addr)
	}

	// 移除服务器
	for addr := range list.master.removedServers {
		delete(list.servers, addr)
		delete(list.master.removedServers, addr)
	}

	list.master.update = false
}
